package com.woniuxy.vuecli.service.impl;

import com.woniuxy.vuecli.entity.Menu;
import com.woniuxy.vuecli.exception.MneuReferenceExcetion;
import com.woniuxy.vuecli.mapper.MenuMapper;
import com.woniuxy.vuecli.mapper.RoleMapper;
import com.woniuxy.vuecli.service.MenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author author
 * @Create 2024-03-05 9:52
 */
@Service
public class MenuServiceImpl implements MenuService {

    @Autowired
    MenuMapper menuMapper;

    @Autowired
    RoleMapper roleMapper;

    @Override
    public List<Menu> getAll() {
        //所有菜单，我们现在是两层菜单，先找出一级菜单，再给一级菜单添加子菜单
//        List<Menu> allMenus = menuMapper.selectAll();
//        List<Menu> menus = new ArrayList<>();
//        for(Menu menu : allMenus){
//            //先找出一级菜单
//            if(menu.getPmid().equals(0)){
//                menus.add(menu);
//                //再给一级菜单添加子菜单
//                menu.setChildren(new ArrayList<>());
//                for(Menu submenu : allMenus){
//                    if(menu.getMid().equals(submenu.getPmid())){
//                        menu.getChildren().add(submenu);
//                    }
//                }
//            }
//        }
//        return menus;
        //JDK8的新特性
        //  API:新增类和方法  日期时间类
        //  语法:,Lambda，Stream，方法引用
        //  底层： JVM有新的垃圾回收算法
        // 使用Stream和Lambda改写上面的代码
        List<Menu> allMenus = menuMapper.selectAll();
        List<Menu> menus = allMenus
                .stream()           //将集合转成流
                .filter(menu -> menu.getPmid().equals(0))   //使用filter筛选集合中满足条件的元素：根节点
                //添加根节点的子节点,使用Map方法，实现Function<参数，返回值>的apply
                //参数是没有设置子节点的Menu,返回值还是Menu(这个是添加了children属性以后得Menu)
                .map( menu -> {
                    menu.setChildren(allMenus.stream().filter(submenu->submenu.getPmid().equals(menu.getMid())).collect(Collectors.toList()));
                    return menu;
                })
                .collect(Collectors.toList());              //收集成一个集合
        return menus;
    }


    @Override
    public List<Integer> getMidsByRid(int rid) {
        //根据rid查询所有的mid
//        List<Menu> menus = menuMapper.selectByRid(rid);
//        List<Integer> mids=new ArrayList<>();
//        for(Menu menu :menus){
//            mids.add(menu.getMid());
//        }
//        return mids;

        List<Menu> menus = menuMapper.selectByRid(rid);
        List<Integer> mids = menus.stream()
                .map(menu -> menu.getMid())
                .collect(Collectors.toList());
        return mids;
    }



    @Override
    public void removeByMid(int mid) {
        //如果有角色和当前菜单已经有关联关系,不能删除
        //要查询mid是否管理了角色，简单查询使用menu和rolemenu就可以了，
        // 我们一般dao写一个通用的方法：根据mid查询所有的角色
        if(roleMapper.selectByMid(mid).size()!=0){
            //菜单被角色使用，不能删除，抛异常
            throw new MneuReferenceExcetion("菜单被引用，不能删除");
        }
        menuMapper.deleteByMid(mid);
    }

    @Override
    public List<Menu> getByEid(int eid) {
        List<Menu> allMenus = menuMapper.selectByEid(eid);
        List<Menu> menus = allMenus
                .stream()
                .filter(menu -> menu.getPmid().equals(0))
                .map( menu -> {
                    menu.setChildren(allMenus.stream().filter(submenu->submenu.getPmid().equals(menu.getMid())).collect(Collectors.toList()));
                    return menu;
                })
                .collect(Collectors.toList());              //收集成一个集合
        return menus;
    }
}
